home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 June / MacFormat 25.iso / Shareware City / Developers / ICAppSourceKit1.0 / ICFileMapWhat.p < prev    next >
Encoding:
Text File  |  1994-11-27  |  18.8 KB  |  651 lines  |  [TEXT/PJMM]

  1. unit ICFileMapWhat;
  2.  
  3. interface
  4.  
  5.     uses
  6.         ICWindowGlobals;
  7.  
  8.     function WhatOpenFileMap (wt: WindowType; item: integer): OSErr;
  9.     function WhatActivateFileMap (wt: WindowType; item: integer; activate: boolean): OSErr;
  10.     function WhatFlushFileMap (wt: WindowType; item: integer): OSErr;
  11.     function WhatCloseFileMap (wt: WindowType; item: integer): OSErr;
  12.     function WhatClickFileMap (wt: WindowType; item: integer; er: eventRecord): OSErr;
  13.     function WhatKeyFileMap (wt: WindowType; item: integer; er: EventRecord): OSErr;
  14.     function WhatCursorFileMap (wt: WindowType; item: integer; pt: Point; cursorid: integer): OSErr;
  15.  
  16. implementation
  17.  
  18.     uses
  19.         IconFamilies, ICStrH, 
  20.  
  21.         ICMappings, ICSubs, ICDialogs, ICMiscSubs, ICSubs, ICDocUtils, ICGlobals, ICIConSuites, ICStandardFile;
  22.  
  23.     const
  24.         ditChange = 1;
  25.         ditMainUserItem = 2;
  26.         ditAdd = 3;
  27.         ditDelete = 4;
  28.         ditList = 5;
  29.  
  30.     const
  31.         ditOK = 1;
  32.         ditCancel = 2;
  33.         ditEditorUserItem = 3;
  34.         ditEntryName = 4;
  35.         ditExtension = 5;
  36.         ditMIMEType = 6;
  37.         ditAsciiRadio = 7;
  38.         ditBinaryRadio = 8;
  39.         ditMacintoshRadio = 9;
  40.         ditType = 10;
  41.         ditCreator = 11;
  42.         ditChooseExample = 12;
  43.         ditApplicationName = 13;
  44.         ditPost = 14;
  45.         ditPostCreator = 15;
  46.         ditPostButton = 16;
  47.         ditNotForIncoming = 17;
  48.         ditNotForOutgoing = 18;
  49.  
  50.     const
  51. (* ditOK = 1; *)
  52. (* ditCancel = 2; *)
  53.         ditManualUserItem = 3;
  54.         ditManualType = 4;
  55.         ditManualCreator = 5;
  56.         ditManualApplicationName = 6;
  57.  
  58.     const
  59.         kCellHeight = 36;
  60.  
  61.     procedure DimButtons (wt: WindowType);
  62.         var
  63.             have_selection: boolean;
  64.             dlg: DialogPtr;
  65.             lh: ListHandle;
  66.     begin
  67.         lh := ListHandle(windowinfo[wt].items[ditList]^.spare_data);
  68.         dlg := windowinfo[wt].window;
  69.         have_selection := (SelectedLine(lh) <> -1);
  70.         SetDCtlEnable(dlg, ditAdd, not IsLocked(wt, ditList));
  71.         SetDCtlEnable(dlg, ditDelete, have_selection and not IsLocked(wt, ditList));
  72.         SetDCtlEnable(dlg, ditChange, have_selection and not IsLocked(wt, ditList));
  73.         OutlineDefault1(dlg, ditMainUserItem);
  74.     end; (* DimButtons *)
  75.  
  76.     procedure MyLDEF (message: integer; select: boolean; var r: Rect; the_cell: Cell; offset: integer; datalen: integer; lh: ListHandle);
  77.         var
  78.             entries: Handle;
  79.  
  80.         procedure LDClose;
  81.         begin
  82.             (* do nothing *)
  83.         end;
  84.  
  85.         procedure LDDraw;
  86.             const
  87.                 HiliteMode = $938;
  88.             var
  89.                 entry: ICMapEntry;
  90.                 pos: longint;
  91.                 err: OSErr;
  92.                 junkpos: longint;
  93.                 suite: Handle;
  94.                 cur_x: integer;
  95.                 junk: OSErr;
  96.                 tmprect: Rect;
  97.                 sys_font_info, appl_font_info: FontInfo;
  98.                 top: integer;
  99.                 transfer: integer;
  100.                 rgn: RgnHandle;
  101.                 rgn2: RgnHandle;
  102.         begin
  103.             if datalen = 0 then begin
  104.                 err := ICMapErr(ICMGetIndEntry(entries, the_cell.v + 1, junkpos, entry));
  105.                 if err = noErr then begin
  106.                     EraseRect(r);
  107.                     cur_x := 0;
  108.                     rgn := NewRgn;
  109.                     if system7 then begin
  110.                         tmprect := r;
  111.                         tmprect.bottom := tmprect.top + 32;
  112.                         tmprect.right := tmprect.left + 32;
  113.                         OffsetRect(tmprect, (kCellHeight - 32) div 2, (kCellHeight - 32) div 2);
  114.                         junk := GetDTDBIconSuiteCached(entry.file_type, entry.file_creator, suite);
  115.                         if suite <> nil then begin
  116.                             if select then begin
  117.                                 transfer := ttSelected;
  118.                             end
  119.                             else begin
  120.                                 transfer := ttNone;
  121.                             end; (* if *)
  122.                             err := PlotIconSuite(tmprect, atNone, transfer, suite);
  123.                             junk := IconSuiteToRgn(rgn, tmprect, atNone, suite);
  124.                         end; (* if *)
  125.                         cur_x := cur_x + kCellHeight;
  126.                     end;
  127.                     cur_x := cur_x + 2;
  128.  
  129.                     TextFont(systemFont);
  130.                     GetFontInfo(sys_font_info);
  131.  
  132.                     TextFont(applFont);
  133.                     GetFontInfo(appl_font_info);
  134.  
  135.                     top := (kCellHeight - (sys_font_info.ascent + sys_font_info.descent + 0 + appl_font_info.ascent + appl_font_info.descent)) div 2;
  136.                     TextFont(systemFont);
  137.                     MoveTo(r.left + cur_x, r.top + top + sys_font_info.ascent);
  138.                     DrawString(concat(entry.creator_app_name, GetAString(128, 5), entry.entry_name));
  139.  
  140.                     TextFont(applFont);
  141.                     MoveTo(r.left + cur_x, r.top + top + sys_font_info.ascent + sys_font_info.descent + 0 + appl_font_info.ascent);
  142.                     DrawString(entry.extension);
  143.  
  144.                     if select then begin
  145.                         rgn2 := NewRgn;
  146.                         RectRgn(rgn2, r);
  147.                         if has_colorQD then begin
  148.                             BitClr(Ptr(HiliteMode), pHiliteBit);
  149.                         end; (* if *)
  150.                         XorRgn(rgn, rgn2, rgn2);
  151.                         InvertRgn(rgn2);
  152.                         DisposeRgn(rgn2);
  153.                     end; (* if *)
  154.                     if rgn <> nil then begin
  155.                         DisposeRgn(rgn);
  156.                     end; (* if *)
  157.                 end; (* if *)
  158.             end;
  159.         end;
  160.  
  161.     begin
  162.         SetPort(lh^^.port);
  163.         entries := Handle(windowinfo[GetWindowType(lh^^.port)].items[ditList]^.data);
  164.         case message of
  165.             lInitMsg: 
  166.                 ;
  167.             lDrawMsg: 
  168.                 LDDraw;
  169.             lHiliteMsg: 
  170.                 LDDraw;
  171.             lCloseMsg: 
  172.                 LDClose;
  173.         end;
  174.     end; (* MyLDEF *)
  175.  
  176.     procedure UserItemUpdate (dlg: DialogPtr; item: integer);
  177.         var
  178.             list_rect: Rect;
  179.     begin
  180.         GetDItemRect(dlg, item, list_rect);
  181.         PenNormal;
  182.         InsetRect(list_rect, -1, -1);
  183.         FrameRect(list_rect);
  184.         LUpdate(dlg^.visRgn, ListHandle(windowinfo[GetWindowType(dlg)].items[item]^.spare_data));
  185.     end; (* UserItemUpdate *)
  186.  
  187.     function WhatOpenFileMap (wt: WindowType; item: integer): OSErr;
  188.         var
  189.             dlg: DialogPtr;
  190.             entries: Handle;
  191.             attr: longint;
  192.             err: OSErr;
  193.             count: longint;
  194.             list_rect: Rect;
  195.             data_rect: Rect;
  196.             cell_size: Point;
  197.             lh: ListHandle;
  198.     begin
  199.         windowinfo[wt].items[item]^.spare_data := nil;
  200.         windowinfo[wt].items[item]^.data := nil;
  201.         err := noErr;
  202.         dlg := windowinfo[wt].window;
  203.         SetDItemHandle(dlg, item, @UserItemUpdate);
  204.         if ICMapErr(ICGetPrefHandle(GetInstance, windowinfo[wt].items[item]^.key, attr, entries)) <> noErr then begin
  205.             entries := NewHandle(0);
  206.             if entries = nil then begin
  207.                 err := memFullErr;
  208.             end; (* if *)
  209.         end; (* if *)
  210.         ProcessAttributes(wt, item, attr);
  211.         if err = noErr then begin
  212.             if ICMCountEntries(entries, count) <> noErr then begin
  213.                 count := 0;
  214.             end; (* if *)
  215.             windowinfo[wt].items[item]^.data := Ptr(entries);
  216.             GetDItemRect(dlg, item, list_rect);
  217.             list_rect.right := list_rect.right - 15;
  218.             SetRect(data_rect, 0, 0, 1, count);
  219.             SetPt(cell_size, list_rect.right - list_rect.left, kCellHeight);
  220.             lh := LNew(list_rect, data_rect, cell_size, 128, dlg, true, false, false, true);
  221.             if lh = nil then begin
  222.                 err := memFullErr;
  223.             end; (* if *)
  224.         end; (* if *)
  225.         if err = noErr then begin
  226.             lh^^.refCon := ord(@MyLDEF);
  227.             lh^^.selFlags := lOnlyOne;
  228.             windowinfo[wt].items[item]^.spare_data := Ptr(lh);
  229.             DimButtons(wt);
  230.             SetUpDefaultOutline(dlg, ditChange, ditMainUserItem);
  231.             windowinfo[wt].selected_item := ditList;
  232.         end; (* if *)
  233.         WhatOpenFileMap := err;
  234.     end; (* WhatOpenFileMap *)
  235.  
  236.     procedure SetRadio (modal: DialogPtr; value: integer);
  237.     begin
  238.         SetDCtlBoolean(modal, ditAsciiRadio, value = ditAsciiRadio);
  239.         SetDCtlBoolean(modal, ditBinaryRadio, value = ditBinaryRadio);
  240.         SetDCtlBoolean(modal, ditMacintoshRadio, value = ditMacintoshRadio);
  241.     end; (* SetRadio *)
  242.  
  243.     function AddChangeFilter (dlg: DialogPtr; var event: EventRecord; var item: integer): boolean;
  244.         var
  245.             res: boolean;
  246.             ch: char;
  247.     begin
  248.         res := CancelModalFilter(dlg, event, item);
  249.         if not res then begin
  250.             if (event.what = keyDown) and (band(event.modifiers, cmdKey) <> 0) then begin
  251.                 ch := char(band(event.message, charCodeMask));
  252.                 if ch in ['1'..'3'] then begin
  253.                     SetRadio(dlg, ord(ch) - ord('1') + ditAsciiRadio);
  254.                 end; (* if *)
  255.             end; (* if *)
  256.         end; (* if *)
  257.         if band(event.modifiers, optionKey) = 0 then begin
  258.             SetDCtlTitle(dlg, ditChooseExample, GetAString(128, 6));
  259.         end
  260.         else begin
  261.             SetDCtlTitle(dlg, ditChooseExample, GetAString(128, 7));
  262.         end; (* if *)
  263.         AddChangeFilter := res;
  264.     end; (* AddChangeFilter *)
  265.  
  266.     function DoDialog (var entry: ICMapEntry): OSErr;
  267.  
  268.         function MapOSType (ot: OSType): Str15;
  269.         begin
  270.             if ot = OSType(0) then begin
  271.                 MapOSType := '';
  272.             end
  273.             else begin
  274.                 MapOSType := ot;
  275.             end; (* if *)
  276.         end; (* MapOSType *)
  277.  
  278.         function MapStr (s: Str255): OSType;
  279.         begin
  280.             s := copy(concat(s, '    '), 1, 4);
  281.             MapStr := s;
  282.         end; (* MapStr *)
  283.  
  284.         var
  285.             modal: DialogPtr;
  286.  
  287.         procedure DoChooseExample;
  288.             var
  289.                 info: FInfo;
  290.                 err: OSErr;
  291.                 fs, app_fss: FSSpec;
  292.         begin
  293.             err := ICStandardGetFile(OSType(0), fs, info);
  294.             DisplayError(acGetExample, err);
  295.             if err = noErr then begin
  296.                 SetItemText(modal, ditType, MapOSType(info.fdType));
  297.                 SetItemText(modal, ditCreator, MapOSType(info.fdCreator));
  298.                 err := MyGetAPPL(info.fdCreator, app_fss);
  299.                 if err = noErr then begin
  300.                     SetItemText(modal, ditApplicationName, app_fss.name);
  301.                 end
  302.                 else begin
  303.                     SetItemText(modal, ditApplicationName, '');
  304.                 end; (* if *)
  305.             end; (* if *)
  306.         end; (* DoChooseExample *)
  307.  
  308.         function ChoosePost: boolean;
  309.             var
  310.                 info: FInfo;
  311.                 err: OSErr;
  312.                 fs, app_fss: FSSpec;
  313.         begin
  314.             err := ICStandardGetFile('APPL', fs, info);
  315.             DisplayError(acGetExample, err);
  316.             if err = noErr then begin
  317.                 entry.post_creator := info.fdCreator;
  318.                 entry.post_app_name := fs.name;
  319.             end; (* if *)
  320.             ChoosePost := err = noErr;
  321.         end;
  322.  
  323.         procedure DoEditTypeCreator;
  324.             var
  325.                 edit_dlg: DialogPtr;
  326.                 item: integer;
  327.                 tmpstr: Str255;
  328.         begin
  329.             edit_dlg := GetNewDialog(701, nil, WindowPtr(-1));
  330.             if edit_dlg <> nil then begin
  331.                 GetItemText(modal, ditType, tmpstr);
  332.                 SetItemText(edit_dlg, ditManualType, tmpstr);
  333.                 GetItemText(modal, ditCreator, tmpstr);
  334.                 SetItemText(edit_dlg, ditManualCreator, tmpstr);
  335.                 GetItemText(modal, ditApplicationName, tmpstr);
  336.                 SetItemText(edit_dlg, ditManualApplicationName, tmpstr);
  337.                 SetUpDefaultOutline(edit_dlg, ditOK, ditManualUserItem);
  338.  
  339.                 SelIText(edit_dlg, ditManualType, 0, 32767);
  340.                 ShowWindow(edit_dlg);
  341.                 InitCursor;
  342.                 repeat
  343.                     ModalDialog(@CancelModalFilter, item);
  344.                 until item in [ditOK, ditCancel];
  345.                 GetItemText(edit_dlg, ditManualType, tmpstr);
  346.                 SetItemText(modal, ditType, tmpstr);
  347.                 GetItemText(edit_dlg, ditManualCreator, tmpstr);
  348.                 SetItemText(modal, ditCreator, tmpstr);
  349.                 GetItemText(edit_dlg, ditManualApplicationName, tmpstr);
  350.                 SetItemText(modal, ditApplicationName, tmpstr);
  351.                 DisposeDialog(edit_dlg);
  352.             end; (* if *)
  353.         end; (* DoEditTypeCreator *)
  354.  
  355.         procedure SetPostInfo;
  356.         begin
  357.             if entry.post_creator <> OSType(0) then begin
  358.                 SetDCtlTitle(modal, ditPostButton, concat('“', entry.post_app_name, '”'));
  359.             end;
  360.             SetItemText(modal, ditPostCreator, MapOSType(entry.post_creator));
  361.             SetDCtlBoolean(modal, ditPost, btst(entry.flags, ICmap_post_bit));
  362.         end;
  363.  
  364.         var
  365.             err: OSErr;
  366.             item: integer;
  367.             flags: longint;
  368.             tmpstr: Str255;
  369.             dummy: boolean;
  370.     begin
  371.         err := noErr;
  372.         modal := GetNewDialog(700, nil, WindowPtr(-1));
  373.         if modal = nil then begin
  374.             err := memFullErr;
  375.         end; (* if *)
  376.         if err = noErr then begin
  377.             SetUpDefaultOutline(modal, ditOK, ditEditorUserItem);
  378.             SetItemText(modal, ditEntryName, entry.entry_name);
  379.             SetItemText(modal, ditExtension, entry.extension);
  380.             SetItemText(modal, ditMIMEType, entry.MIME_type);
  381.             SetDCtlBoolean(modal, ditAsciiRadio, not btst(entry.flags, ICmap_binary_bit));
  382.             SetDCtlBoolean(modal, ditBinaryRadio, btst(entry.flags, ICmap_binary_bit) and not (btst(entry.flags, ICmap_resource_fork_bit)));
  383.             SetDCtlBoolean(modal, ditMacintoshRadio, btst(entry.flags, ICmap_binary_bit) and (btst(entry.flags, ICmap_resource_fork_bit)));
  384.             SetDCtlBoolean(modal, ditNotForIncoming, btst(entry.flags, ICmap_not_incoming_bit));
  385.             SetDCtlBoolean(modal, ditNotForOutgoing, btst(entry.flags, ICmap_not_outgoing_bit));
  386.             SetItemText(modal, ditType, MapOSType(entry.file_type));
  387.             SetItemText(modal, ditCreator, MapOSType(entry.file_creator));
  388.             SetItemText(modal, ditApplicationName, entry.creator_app_name);
  389.             SetPostInfo;
  390.             SelIText(modal, ditEntryName, 0, 32767);
  391.             ShowWindow(modal);
  392.             InitCursor;
  393.             repeat
  394.                 ModalDialog(@AddChangeFilter, item);
  395.                 case item of
  396.                     ditAsciiRadio..ditMacintoshRadio:  begin
  397.                         SetRadio(modal, item);
  398.                     end;
  399.                     ditNotForIncoming..ditNotForOutgoing:  begin
  400.                         ToggleDCtlBoolean(modal, item);
  401.                     end;
  402.                     ditChooseExample:  begin
  403.                         if IsKeyDown(kOptionKeyCode) then begin
  404.                             DoEditTypeCreator;
  405.                         end
  406.                         else begin
  407.                             DoChooseExample;
  408.                         end; (* if *)
  409.                     end;
  410.                     ditPost:  begin
  411.                         if not btst(entry.flags, ICmap_post_bit) then begin
  412.                             if (entry.post_creator = OSType(0)) then begin
  413.                                 if entry.file_creator <> OSType(0) then begin
  414.                                     entry.post_creator := entry.file_creator;
  415.                                     entry.post_app_name := entry.creator_app_name;
  416.                                 end
  417.                                 else begin
  418.                                     dummy := ChoosePost;
  419.                                 end;
  420.                             end;
  421.                             if entry.post_creator <> OSType(0) then begin
  422.                                 bset(entry.flags, ICmap_post_bit);
  423.                             end;
  424.                         end
  425.                         else begin
  426.                             bclr(entry.flags, ICmap_post_bit);
  427.                         end;
  428.                         SetPostInfo;
  429.                     end;
  430.                     ditPostButton:  begin
  431.                         if ChoosePost then begin
  432.                             bset(entry.flags, ICmap_post_bit);
  433.                         end;
  434.                         SetPostInfo;
  435.                     end;
  436.                     otherwise
  437.                         ;
  438.                 end; (* case *)
  439.             until item in [ditOK, ditCancel];
  440.             if item = ditOK then begin
  441.                 GetItemText(modal, ditEntryName, entry.entry_name);
  442.                 GetItemText(modal, ditExtension, entry.extension);
  443.                 GetItemText(modal, ditMIMEType, entry.MIME_type);
  444.  
  445.                 flags := band(entry.flags, BNOT(ICmap_binary_mask + ICmap_data_fork_mask + ICmap_resource_fork_mask + ICmap_not_incoming_mask + ICmap_not_outgoing_mask));
  446.                 flags := flags + ICmap_data_fork_mask;
  447.                 if not GetDCtlBoolean(modal, ditAsciiRadio) then begin
  448.                     flags := flags + ICmap_binary_mask;
  449.                 end; (* if *)
  450.                 if GetDCtlBoolean(modal, ditMacintoshRadio) then begin
  451.                     flags := flags + ICmap_resource_fork_mask;
  452.                 end; (* if *)
  453.                 if GetDCtlBoolean(modal, ditNotForIncoming) then begin
  454.                     flags := flags + ICmap_not_incoming_mask;
  455.                 end; (* if *)
  456.                 if GetDCtlBoolean(modal, ditNotForOutgoing) then begin
  457.                     flags := flags + ICmap_not_outgoing_mask;
  458.                 end; (* if *)
  459.                 entry.flags := flags;
  460.  
  461.                 GetItemText(modal, ditType, tmpstr);
  462.                 entry.file_type := MapStr(tmpstr);
  463.                 GetItemText(modal, ditCreator, tmpstr);
  464.                 entry.file_creator := MapStr(tmpstr);
  465.                 GetItemText(modal, ditApplicationName, entry.creator_app_name);
  466.             end
  467.             else begin
  468.                 err := userCanceledErr;
  469.             end; (* if *)
  470.         end; (* if *)
  471.         if modal <> nil then begin
  472.             DisposeDialog(modal);
  473.         end; (* if *)
  474.         DoDialog := err;
  475.     end; (* DoDialog *)
  476.  
  477.     function DoAddChange (selection: integer; var entry: ICMapEntry; entries: Handle; lh: ListHandle): OSErr;
  478.         var
  479.             junkint: integer;
  480.             err: OSErr;
  481.             pos: longint;
  482.             app_fss: FSSpec;
  483.     begin
  484.         if selection = -1 then begin
  485.             with entry do begin
  486.                 fixed_length := 18;
  487.                 version := 0;
  488.                 file_type := OSType(0);
  489.                 file_creator := OSType(0);
  490.                 flags := 0;
  491.                 extension := '';
  492.                 creator_app_name := '';
  493.                 MIME_type := '';
  494.                 entry_name := '';
  495.             end; (* with *)
  496.             err := noErr;
  497.         end
  498.         else begin
  499.             err := ICMapErr(ICMGetIndEntry(entries, selection + 1, pos, entry));
  500.         end; (* if *)
  501.  
  502.         if err = noErr then begin
  503.             err := DoDialog(entry);
  504.         end; (* if *)
  505.  
  506.         if err = noErr then begin
  507.             if selection = -1 then begin
  508.                 err := ICMapErr(ICMAddEntry(entries, entry));
  509.                 if err = noErr then begin
  510.                     junkint := LAddRow(1, 32767, lh);
  511.                 end; (* if *)
  512.             end
  513.             else begin
  514.                 err := ICMapErr(ICMSetEntry(entries, pos, entry));
  515.             end; (* if *)
  516.         end; (* if *)
  517.         DoAddChange := err;
  518.     end; (* DoAddChange *)
  519.  
  520.     function WhatClickFileMap (wt: WindowType; item: integer; er: eventRecord): OSErr;
  521.         var
  522.             lh: ListHandle;
  523.             entry: ICMapEntry;
  524.             entries: Handle;
  525.             selection: integer;
  526.             err: OSErr;
  527.             pos: longint;
  528.             r: Rect;
  529.     begin
  530.         entries := Handle(windowinfo[wt].items[ditList]^.data);
  531.         lh := ListHandle(windowinfo[wt].items[ditList]^.spare_data);
  532.         GlobalToLocal(er.where);
  533.         selection := SelectedLine(lh);
  534.         err := 1;
  535.         case item of
  536.             ditAdd: 
  537.                 err := DoAddChange(-1, entry, entries, lh);
  538.             ditChange: 
  539.                 err := DoAddChange(selection, entry, entries, lh);
  540.             ditDelete: 
  541.                 if selection <> -1 then begin
  542.                     err := ICMapErr(ICMGetIndEntry(entries, selection + 1, pos, entry));
  543.                     if err = noErr then begin
  544.                         err := ICMapErr(ICMDeleteEntry(entries, pos));
  545.                     end; (* if *)
  546.                     if err = noErr then begin
  547.                         LDelRow(1, selection, lh);
  548.                     end; (* if *)
  549.                 end; (* if *)
  550.             ditList:  begin
  551.                 if LClick(er.where, 0, lh) then begin
  552.                     if IsLocked(wt, item) then begin
  553.                         LockedAlert(wt, item);
  554.                         err := userCanceledErr;
  555.                     end
  556.                     else begin
  557.                         FlashItem(windowinfo[wt].window, ditChange);
  558.                         err := DoAddChange(SelectedLine(lh), entry, entries, lh);            (* selection may have been changed by LClick *)
  559.                     end; (* if *)
  560.                 end; (* if *)
  561.             end;
  562.         end; (* case *)
  563.         if err = noErr then begin
  564.             DirtyDocument;
  565.         end; (* if *)
  566.         if err = 1 then begin
  567.             err := noErr;
  568.         end; (* if *)
  569.         DimButtons(wt);
  570.         WhatClickFileMap := err;
  571.     end; (* WhatClickFileMap *)
  572.  
  573.     function WhatFlushFileMap (wt: WindowType; item: integer): OSErr;
  574.     begin
  575.         WhatFlushFileMap := ICMapErr(ICSetPrefHandle(GetInstance, windowinfo[wt].items[item]^.key, ICattr_no_change, Handle(windowinfo[wt].items[item]^.data)));
  576.     end; (* WhatFlushFileMap *)
  577.  
  578.     function WhatCloseFileMap (wt: WindowType; item: integer): OSErr;
  579.     begin
  580.         LDispose(ListHandle(windowinfo[wt].items[item]^.spare_data));
  581.         DisposeHandle(Handle(windowinfo[wt].items[item]^.data));
  582.         WhatCloseFileMap := noErr;
  583.     end; (* WhatCloseFileMap *)
  584.  
  585.     function WhatActivateFileMap (wt: WindowType; item: integer; activate: boolean): OSErr;
  586.     begin
  587.         LActivate(activate, ListHandle(windowinfo[wt].items[item]^.spare_data));
  588.         WhatActivateFileMap := noErr;
  589.     end; (* WhatActivateFileMap *)
  590.  
  591.     function GetEntryName (list: ListHandle; c: cell): str255;
  592.         var
  593.             entry: ICMapEntry;
  594.             err: OSErr;
  595.             junkpos: longint;
  596.             entries: handle;
  597.     begin
  598.         GetEntryName := '';
  599.         entries := Handle(windowinfo[GetWindowType(list^^.port)].items[ditList]^.data);
  600.         err := ICMapErr(ICMGetIndEntry(entries, c.v + 1, junkpos, entry));
  601.         if err = noErr then begin
  602.             GetEntryName := concat(entry.creator_app_name, GetAString(128, 5), entry.entry_name);
  603.         end;
  604.     end;
  605.  
  606.     function WhatKeyFileMap (wt: WindowType; item: integer; er: EventRecord): OSErr;
  607.         var
  608.             ch: integer;
  609.             changed: boolean;
  610.             entry: ICMapEntry;
  611.             lh: ListHandle;
  612.             err: OSErr;
  613.     begin
  614.         lh := ListHandle(windowinfo[wt].items[ditList]^.spare_data);
  615.         err := noErr;
  616.         if (er.what = keyDown) or (er.what = autoKey) then begin
  617.             ch := BAND(er.message, $FF);
  618.             case ch of
  619.                 crChar, enterChar:  begin
  620.                     if GetDCtlEnable(windowinfo[wt].window, ditChange) then begin
  621.                         FlashItem(windowinfo[wt].window, ditChange);
  622.                         err := DoAddChange(SelectedLine(lh), entry, Handle(windowinfo[wt].items[ditList]^.data), lh);
  623.                         if err = noErr then begin
  624.                             DirtyDocument;
  625.                         end;
  626.                     end; (* if *)
  627.                 end;
  628.                 otherwise begin
  629.                     DoListKey(lh, er.modifiers, chr(BAND(er.message, $FF)), @GetEntryName);
  630.                     DimButtons(wt);
  631.                 end;
  632.             end;
  633.         end;
  634.         WhatKeyFileMap := err;
  635.     end; (* WhatKeyFileMap *)
  636.  
  637.     function WhatCursorFileMap (wt: WindowType; item: integer; pt: Point; cursorid: integer): OSErr;
  638.         var
  639.             r: Rect;
  640.     begin
  641.         GetDItemRect(windowinfo[wt].window, item, r);
  642.         InsetRect(r, 15, 0);
  643.         if PtInRect(pt, r) then begin
  644.             SetCursor(GetCursor(cursorid)^^);
  645.         end
  646.         else begin
  647.             InitCursor;
  648.         end; (* if *)
  649.     end; (* WhatCursorFileMap *)
  650.  
  651. end. (* ICFileMapWhat *)